#include<bits/stdc++.h> 
using namespace std;
//	Eva喜欢从各个大学收集硬币，包括火星等其他星球。一天，她参观一个可以用各种硬币付费的宇
//	宙购物商城，但是有一个特殊的要求：对于每一笔钱，只能用两枚硬币来支付且正好是这个价格
//	现在Eva有100000枚硬币，你需要帮忙判断她能否付款
//1.每个输入有一个测试用例，每个测试用例第一行是2个正整数N≤100000，M≤1000。分别表示硬币
//	总数和Eva需要付款的总数。、
//2.第二行包括N个正整数，表示这N枚硬币的面值，Vi≤500
//3.对于每个测试用例，输出一行，包括两个面值V1和V2，其中V1+V2=M且V1≤V2。如果答案不唯一，
//	则输出V1最小的那个。如果不存在结果，则输出No Solution
//4.性能题
int main(){	//如果直接直接双重嵌套的话必然超时， 
	int N,M;
	cin>>N>>M;
	int V[N], U[N];	//用来存储面值以及总价-面值的值 
	for(int i = 0;i<N;i++){
		cin>>V[i];
	}
	sort(V,V+N);	//排序面值 
	for(int i = 0;i<N;i++){
		U[N-i-1] = M - V[i];	//面值从小到大，余差从大到小，然后倒序存储，还是从小到大 
	}
	int t = 0;
	for(int i =0;i<N;i++){	//然后比较余差在面值中是否存在 
		if(V[i]>=M) break;	//如果面值大于M了，则跳出 
		if(V[i]==U[t]){	//如果面值和余差相同的话 
			if(M-V[i]!=V[i]||(i!=N-1&&M-V[i]==V[i]&&V[i]==V[i+1])){	//两个值不一样就直接输出，如果一样还得考虑是不是1的面值2的M，余差为1导致1=1的情况，所以要排除 
				cout<<V[i]<<" "<<M-V[i]<<endl;
				return 0;
			}
			else t++;	//如果是上面说的情况，则t++，然后下一轮也i++，进入下一个数字的判断 
		}
		else if(V[i]<U[t]) continue;	//如果当前比较的面值比余差小，则面值往后判断 
		else{	//否则余差往后走，面值还留在当前 
			t++;
			i--;
		}
	}
	cout<<"No Solution"<<endl;	//如果循环里都没有结果，则输出无结果 
	return 0;
} 